package com.多用户通讯编程.QQ.Client.Service;

import com.多用户通讯编程.QQ.Common.Message;
import com.多用户通讯编程.QQ.Common.MessageType;

import java.io.*;
import java.net.Socket;

@SuppressWarnings("all")
public class ClientConnectServerThread extends Thread {
    /// 用来接受服务器的通道
    private Socket socket;
    private ObjectInputStream ois = null;
    private ObjectOutputStream oos = null;
    private volatile boolean loop = true;


    public void setLoop(boolean loop) {
        this.loop = loop;
    }

    public ClientConnectServerThread(Socket socket , ObjectInputStream ois , ObjectOutputStream oos) {
        this.socket = socket;
        this.ois = ois;
        this.oos = oos;
    }

    public Socket getSocket() {
        return socket;
    }

    public void setSocket(Socket socket) {
        this.socket = socket;
    }

    public ObjectInputStream getInputStream() {
        return ois;
    }

    public void SetInputStream(ObjectInputStream ois) {
        this.ois = ois;
    }

    public ObjectOutputStream getOutputStream() {
        return oos;
    }

    public void setOutputStream(ObjectOutputStream oos) {
        this.oos = oos;
    }

    /// 用来接受服务器信息的线程
    @Override
    public void run() {
        try { /// 获取输入流，得到消息对象再读取；
//            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            while (loop) {
               
                System.out.println("客户端正在等待 服务端 发送的消息 ~~~");
                /// 这里会一直读取服务器发送的消息，如果没有数据来就一直等着，来了就可以拿到消息对象
                Message message = (Message) ois.readObject();


                /// 如果接收到的消息类型是群发
                if (message.getMesType().equals(MessageType.MESSAGE_TO_ALL_MES)){
                    System.out.println(message.getSender()+"对大家说 :" + message.getContent());
                }
                /// 如果接收到的消息类型是私聊（普通）
                if (message.getMesType().equals(MessageType.MESSAGE_COMM_MES)){
                    System.out.println("用户 "+message.getSender()+" 在 "+message.getSendTime()+" 给我 ("+message.getGetter()+") 发来私信: "+message.getContent());
                }
                /// 如果接收到的消息类型是返回在线人员，规定服务器返回的时候是一个对象+一个空格，便于分割；
                if (message.getMesType().equals(MessageType.MESSAGE_RET_ONLINE_FRIEND)) {
                    String[] s = message.getContent().split(" ");
                    System.out.println("========在线用户列表================");
                    for (int i = 0; i < s.length; i++) {
                        System.out.println("第 "+(i+1)+" 个用户 " +s[i]);
                    }
                    System.out.println("==================================");
                }
                /// 如果接收到的消息类型是 用户不在线
                if (message.getMesType().equals(MessageType.MESSAGE_USER_NOT_ONLINE)){
                    System.out.println("用户不在线 , 已离线留言");
                }
                /// 如果接收到的消息类型是 用户不存在
                if (message.getMesType().equals(MessageType.MESSAGE_USER_NOT_EXISTS)){
                    System.out.println("用户不存在");
                }

                /// 接收文件，
                if (message.getMesType().equals(MessageType.MESSAGE_FILE_MES)){
                    System.out.println(message.getSender()+" 给 我 (" +message.getGetter()+ ") 发送文件， 保存到了 "+message.getDestPath());
                    ///拿到发过来的文件数据
                    byte[] bytes = message.getBytes();
                    /// 创建输出流，保存到指定路径 destPath
                    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(message.getDestPath()));
                    bos.write(bytes);
                    bos.flush();
                    bos.close();
                }

            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        

    }
}
